package main

import (
	"fmt"
	"math/rand"
	"time"
)

// 使用 select 处理多个通道
func main() {
	c := make(chan int)
	for i := 0; i < 5; i++ {
		go sleepyGopher(i, c)
	}
	// time.After 函数，返回一个通道，
	// 该通道在指定时间后会接收到一个值（该值的发送方是 Go 运行时的一个 goroutine ）
	timeout := time.After(2 * time.Second)

	for i := 0; i < 5; i++ {
		// select 和 switch 有点像。
		// 该语句包含的每个 case 都持有一个通道，用来发送或接收数据。
		// select 会等待直到某个 case 分支的操作就绪，然后就会执行该 case 分支
		select {
		case gopherID := <-c:
			fmt.Println("gopher ", gopherID, " has finished sleeping")

		// 超过两秒走这个分支 因为timeout通道时长为2秒
		case <-timeout:
			fmt.Println("my patience ran out")
			return
		}
	}
}
func sleepyGopher(id int, c chan int) {
	// 0~4秒随机
	time.Sleep(time.Duration(rand.Intn(4)) * time.Second)
	c <- id
}
